# 为了是函数的参数更具有拓展性，我们引入万能参数（接受多余的参数）
"""
# 动态位置形参，*形参名(一般用args)，聚合
def add_unm(a, *kw):
    # 在实参角度： *会将所有未在形参中指定位置参数聚
    # 合为一个元组赋给kw这个位置参数
    sum1 = 0
    for i in kw:
        sum1 += i
    print(a)
    return sum1


print(add_unm(1, 2, 3, 5))


# 动态关键字形参(**作用是把关键字和参数作为键和值聚合到一个字典中)
def func(**kwargs):
    print(kwargs)


func(name='Wang', age=20)
"""

# *在函数内的作用为聚合，在函数外是打散
"""
# *可以将数据类型打散为单个元素
print(*[1, 2], *'123', *{1, 2, 3})
# **可以将字典打散为 键=值 的形式(此时字典的键不能为数字)
# 先打散，再聚合


def func(*args, name=3, **kwargs,):
    print(args)
    print(kwargs)
    print(name)


func(*[1, 2], *'123', *{1, 2, 3}, **{'a': 1}, **{'b': 2})
"""

# *在结构中可以处理多余数据（把所有多余数据聚合为一个列表）
"""
a, b, *c = 1, 2, 3, 4, 5, 6
print(a, b, c)
d, *e, f = [7, 8, 9, 10]
print(d, e, f)
# range与元组相似，不可变，可迭代
l, *t = range(5)
print(range(2))
print(l, t)
g, *h, i ='1546872'
print(g, h, i)
"""

# 参数位置
"""
# 位置参数，*args，默认参数，**kwargs
# 若位置参数在*args后，位置参数就不会接收到值
# 默认参数在前，会被多余的位置参数将值改变
# **kwargs是参数的终点，后面不能再有任何形式的参数


def func(a, b, *args, sex="女", **kwargs):
    print(a, b)
    print(args)
    print(sex)
    print(kwargs)


func(1, 2, 3, 4, 5, sex='男', name='alex')
"""

# 形参的第四种传参，仅限关键字参数
"""
# 不是默认参数，且位于*args和**kwargs之间的位置参数
# 所以必须要用位置参数传参


def func(a, b, *args, sex="女", c, **kwargs):
    print(a, b)
    print(args)
    print(sex)
    print(kwargs)
    print(c)


func(1, 2, 3, 4, 5, sex='男', name='alex', c=10)
"""
